#include <iostream>
using namespace std;

// 基类
class Animal {
public:
    Animal(int age) : age(age) {}
    void breathe() { cout << "Animal breathing" << endl; }
protected:
    int age;
};

// 虚继承中间类1
class Mammal : virtual public Animal {  // 虚继承声明
public:
    Mammal(int age) : Animal(age) {}
    void feedMilk() { cout << "Mammal feeding milk" << endl; }
};

// 虚继承中间类2
class WingedAnimal : virtual public Animal {  // 虚继承声明
public:
    WingedAnimal(int age) : Animal(age) {}
    void flapWings() { cout << "WingedAnimal flapping wings" << endl; }
};

// 最终派生类
class Bat : public Mammal, public WingedAnimal {
public:
    // 必须直接初始化虚基类
    Bat(int age) : Animal(age), Mammal(age), WingedAnimal(age) {}
    void showAge() { cout << "Bat's age: " << age << endl; }  // 无二义性访问
};

/*
虚继承声明：在中间类（Mammal和WingedAnimal）继承时使用virtual关键字，确保Animal作为虚基类
构造函数调用：最终派生类Bat必须直接调用虚基类的构造函数，这是虚继承的重要特征
避免成员重复：
未使用虚继承时，Bat会包含两个Animal子对象导致age成员二义性
使用虚继承后，Bat仅包含一个共享的Animal子对象
方法访问：
可以直接调用基类方法breathe()而无需作用域限定符
成员变量age的访问也不会产生二义性
*/
int main() {
    Bat bat(3);
    bat.breathe();   // 明确访问唯一基类成员
    bat.feedMilk();
    bat.flapWings();
    bat.showAge();
    return 0;
}